//
//  main.c
//  条件编译
//
//  Created by ws on 2017/7/25.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>

/**
 分支结构的if:当条件满足的时候就会执行if后面的语句
           在程序运行的阶段进行判断的
 条件编译:当条件满足的时候才会编译#if后面的语句
   1.条件编译中的条件只能由宏定义和常量组成,不能出现变量
   2.在程序编译的时候进行判断的
 注意点:
 1.必须是以#endif结尾
 
 条件编译作用:
 1.Log
 2.条件编译可以防止头文件的重复包含(就是当重复导入两个一样的头文件的时候)
 */
void test(){
    //    int week  = 3;
    //    if (week == 1) {
    //        printf("星期一\n");
    //    }else if(week == 2){
    //        printf("星期二\n");
    //    }else if(week == 3){
    //        printf("星期三\n");
    //    }else if(week == 4){
    //        printf("星期四\n");
    //    }else if(week == 5){
    //        printf("星期五\n");
    //    }else if(week == 6){
    //        printf("星期六\n");
    //    }else if(week == 7){
    //        printf("星期日\n");
    //    }else{
    //        printf("药不能停\n");
    //    }
#define week 1
#if week == 1
    printf("星期一\n");//编译的时候只执行这一行代码,所以比上面代码省内存,因为在预编译的时候已经做完了条件判断
#elif week == 2
    printf("星期二\n");
#elif week == 3
    printf("星期三\n");
#elif week == 4
    printf("星期四\n");
#elif week == 5
    printf("星期五\n");
#elif week == 6
    printf("星期六\n");
#elif week == 7
    printf("星期日\n");
#else
    printf("药不能停\n");
#endif

}

//使用场景
//取消某个宏定义
//DEBUG 系统自带宏,发布的时候为0,开发的时候为1
//#undef DEBUG
//如果定义了某些宏
#ifdef DEBUG
#define Log(formatter,...) printf(formatter,##__VA_ARGS__);
//__VA_ARGS__ 固定写法表示多参数
//## 表示可以不带参数
#else
#define Log(formatter,...)
#endif
void test1(){
    Log("%s\n","测试");
     Log("测试\n");
    printf("%s\n","测试11");
}
//判断一个宏是否存在
#ifdef 宏名
//  如果定义某个宏编译这里面的语句
#endif

#ifndef 宏名
//  如果没有定义某个会编译这里面的语句
#endif

//例如
#define A//定义一个宏
void test2(){
    
#ifdef A
    printf("宏A已经定义了\n");
#endif
    
#ifndef A
    printf("宏A没有定义了\n");
#endif
    
    //如果有A这个宏 那么编译完成之后其他语句都没有啦 就剩下 printf("宏A已经定义了\n");一行代码,反之就剩下printf("宏A没有定义了\n");这一行代码
}


//条件编译可以防止头文件的重复包含(就是当重复导入两个一样的头文件的时候)
#ifndef me_h//如过没有定义me_h这个宏
#define me_h//定义这个宏和里面的代码

#include <stdio.h>

int sum(int num1,int num2);
int minus(int num1,int num2);
int max(int num1,int num2);

#endif /* me_h */

#ifndef me_h//到这一行上面已经定义了 所以直接就#endif
#define me_h

#include <stdio.h>

int sum(int num1,int num2);
int minus(int num1,int num2);
int max(int num1,int num2);

#endif /* me_h */

int main(int argc, const char * argv[]) {
    int rs = sum(10, 20);
    printf("rs = %d\n",rs);
    return 0;
}
